package vip.liux.contracts.security.core.extensions;


import java.util.List;

/**
 * 提供用于存储用户恢复码的抽象接口。
 *
 * @param <TUser> 封装用户的类型。
 */
public interface IUserTwoFactorRecoveryCodeStore<TUser> extends IUserStore<TUser> {
    /**
     * 更新用户的恢复码，并使之前的恢复码失效。
     *
     * @param user          要为其存储新恢复码的用户。
     * @param recoveryCodes 新的恢复码列表。
     */
    void replaceCodes(TUser user, List<String> recoveryCodes);

    /**
     * 判断指定恢复码对用户是否有效。注意：恢复码仅可使用一次，使用后即失效。
     *
     * @param user 拥有恢复码的用户。
     * @param code 要使用的恢复码。
     * @return 如果恢复码有效返回 true，否则返回 false。
     */
    boolean redeemCode(TUser user, String code);

    /**
     * 返回用户剩余有效恢复码的数量。
     *
     * @param user 拥有恢复码的用户。
     * @return 有效恢复码数量。
     */
    int countCodes(TUser user);
}